<!DOCTYPE html>
<html lang="ja">
<head>
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="https://best.openssf.org/assets/css/style.css">
<link rel="stylesheet" href="checker.css">
<script src="checker.js"></script>
<script src="sql-injection.js"></script>
<link rel="license" href="https://creativecommons.org/licenses/by/4.0/">

<!-- See create_labs.md for how to create your own lab! -->

</head>
<body>
<!-- For GitHub Pages formatting: -->
<div class="container-lg px-3 my-5 markdown-body">
<h1>ラボ演習 sql-injection</h1>
<p>
これはセキュアなソフトウェア開発に関するラボ演習です。
ラボの詳細については、<a href="ja_introduction.html" target="_blank">概要</a>をご覧ください。

<p>
<h2>ゴール</h2>
<p>
<b>SQL インジェクション攻撃を防ぐために、パラメータ化されたステートメントの構築方法を学びます
</b>

<p>
<h2>背景</h2>
<p>
パラメータ化されたステートメントは、SQLコードとデータ入力を分離することで SQL インジェクション攻撃を防ぐために使用されます。パラメータ化されたステートメントとは、ユーザー入力をクエリに直接埋め込むのではなく、プレースホルダを利用する SQL クエリです。これにより、クエリに悪意のあるコードが挿入されるのを防ぎます。
<p>
<h2>タスクの詳細</h2>
<p>

<p>
このラボでは、SQL インジェクション攻撃に関連するコードを学び、それを修正します。プリペアドステートメント / パラメータ化されたステートメントについて、いくつかの問いに答えてください。

<p>
必要に応じて、「ヒント」ボタンと「諦める」ボタンを使用してください。

<p>
<h2>演習 (<span id="grade"></span>)</h2>
<p>
Java で書かれた以下のサンプルコードを見ると、脆弱性を含むコードの一例であることが分かります。
（この例は
<a href="https://github.com/ossf/secure-sw-dev-fundamentals/blob/main/secure_software_development_fundamentals.md">Secure
Software Development Fundamentals</a> コースの内容を直接引用しました）
（訳注：リンクはコースの GitHub レポジトリを指しているため英語です）
これをプリペアドステートメント（パラメータ化されたステートメントの一種）を使用するシーケンスとなるように書き換えます。
最初の部分では、<tt>pstmt</tt> という名前で <tt>PreparedStatement</tt> 型の変数を作ります。
二つ目の部分では、<tt>setString</tt> を使って検索対象を設定し、<tt>ResultSet</tt> 型の <tt>results</tt> 変数に結果を格納します。
ここでは結果のコレクションを得たいので、クエリの実行には <tt>executeQuery</tt> を使用してください。

<form id="lab">
<pre><code
> // クエリの準備
<textarea id="attempt0" rows="4" cols="60" spellcheck="false"
>  String QueryString =
     "select * from authors where lastname = ' " +
     search_lastname + " '; ";
</textarea>
  // クエリの実行
<textarea id="attempt1" rows="3" cols="60" spellcheck="false"
>  rs = statement.executeQuery(QueryString);
</textarea>
</code></pre>
<button type="button" class="hintButton">ヒント</button>
<button type="button" class="resetButton">リセット</button>
<button type="button" class="giveUpButton">諦める</button>
</form>
<br><br>
<p>
<i>このラボは Elijah Everett, Jeremiah Howard, および Emily Lovell により
<a href="https://github.com/emmet0r/contributor-catalyst"
>Contributor Catalyst Program</a> の一部として、また David A. Wheeler により開発されました。</i>
<br><br>
<p id="correctStamp" class="small">
<textarea id="debugData" class="displayNone" rows="20" cols="65" readonly>
</textarea>
</div>
</body>
</html>
